package com.itheima.threadpool2;


import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 自己创建线程池
 *      Java中提供了两个工具类来帮我们创建按线程池 但这只是他把代码封装给我们了 不够灵活
 *      我们可以自己创建线程池
 *      再工具类的源码中可以发现其实他也是创建了一个对象 ThreadPoolExecutor -- 线程执行程序
 *      这个对象的构造方法可以最多传 7 个参数
 *
 * 饭店的故事
 *      核心元素
 *          -- 正式员工的数量                           -- 核心线程的数量 ( > 0 )
 *          -- 餐厅最大员工数 (正式员工 + 临时员工)       -- 线程池最大线程的数量 (大于核心线程数量)
 *          -- 临时员工最多空闲多久就被辞退 (时间)         -- 空闲时间 (值 > 0)
 *          -- 临时员工最多空闲多久就被辞退 (单位)          -- 空闲时间 (TimeUnit指定)
 *          -- 排队的客户                                -- 阻塞队列 (非空)
 *          -- 从哪里招人                                -- 排队方式 (非空)
 *          -- 排队人数多少个时就拒绝服务                    -- 待执行的任务过多时的解决方案 (非空)
 *
 *     核心线程永不销毁
 *     临时线程空闲久了就销毁
 *
 *     流程：
 *          -- 当提交很多任务时 系统会先把核心线程分配给任务去执行 核心线程满了就把后面的任务放到阻塞队列中
 *          -- 当阻塞队列也满了的时候 就开始创建临时线程去处理多的数据
 *          -- 先提交的任务不一定先执行
 *          -- 当提交的任务太多 临时线程也满足不了 那就出发拒绝策略 --> 四种策略
 */
public class MyThreadPoolDemo1 {

    public static void main(String[] args) {


        // 创建线程池对象
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                3 , //核心线程数量
                6 , // 最大线程数
                60 , //60s
                TimeUnit.SECONDS ,  //单位
                new LinkedBlockingQueue<Runnable>(),    //阻塞队列  --> 链表实现
                new ThreadPoolExecutor.CallerRunsPolicy()   //拒绝服务方式 (new 外部类.内部类)
        ) ;
    }
}
